K8s透過ConfigMap將配置文件從容器中解耦, 讓用戶可以集中管理配置內容, 增加了容器的可移值性。
一個ConfigMap就是一組配置數據的集合,其結構是以Key-Value的格式儲存, 這些數據可透過掛Volume或是傳遞環境變數的方式注入到Pod裡面, 讓容器可以應用。
這邊使用配置YAML的方式創建, ConfigMap的spec配置字段有:apiVersion
, kind
, metadata
, data
, data
是用於儲存數據的關鍵字:
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-demo
namespace: default
data:
test.info: hello
test.type: demo
test.file: /var/log/test.log
-> % kubectl get configmap -o yaml
apiVersion: v1
items:
- apiVersion: v1
data:
test.file: /var/log/test.log
test.info: hello
test.type: demo
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"test.file":"/var/log/test.log","test.info":"hello","test. type":"demo"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"configmap-demo","namespace":"default"}}
creationTimestamp: "2020-09-26T14:26:45Z"
name: configmap-demo
namespace: default
resourceVersion: "637447"
selfLink: /api/v1/namespaces/default/configmaps/configmap-demo
uid: 54c0f06c-f9d3-4be8-8558-a780700f044d
kind: List
metadata:
resourceVersion: ""
selfLink: ""
valueFrom:
configMapKeyRef:
key:
name:
optional:
name
: 要引用的ConfigMap名稱
key
: 指定要引用的ConfigMap中的特定的key
optional
: 標記讓Pod知道這個引用是否可正常使用
使用環境變量 配置YAML ConfigMap+Pod , 兩個資源中間使用---
相隔
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-demo-2
namespace: default
data:
httpd_port: "8080"
verbose_level: "-vv"
---
apiVersion: v1
kind: Pod
metadata:
name: configmap-env-demo
namespace: default
spec:
containers:
- image: evelynocean/hello:v1.0.0
name: hello
command: ["./hello"]
args: ["-p","$(HTTPD_PORT)"]
env:
- name: HTTPD_PORT
valueFrom:
configMapKeyRef:
name: configmap-demo-2
key: httpd_port
- name: HTTPD_LOG_VERBOSE
valueFrom:
configMapKeyRef:
name: configmap-demo-2
key: verbose_level
optional: true
-> % kubectl exec configmap-env-demo ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.2 38316 5344 ? Ssl 07:16 0:00 ./hello -p 8080
spec:
containers:
- images: some-image
envFrom:
- prefix <string>
configMapRef:
name <string>
optional <boolean>
envFrom適用於一次導入多個ConfigMap的情境, 為了避免ConfigMap彼此之間命名重複, 可以使用prefix
加上前綴做分別。
如果原本的key使用了-
, 則會被自動替換為_
apiVersion: v1
kind: Pod
metadata:
name: configmap-envfrom-demo
namespace: default
spec:
containers:
- image: evelynocean/hello:v1.0.0
name: hello
command: ["./hello"]
args: ["-p","$(PRE_HTTPD_PORT)"]
envFrom:
- prefix: PRE_
configMapRef:
name: configmap-demo-2
optional: false
-> % kubectl exec configmap-envfrom-demo printenv
PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=configmap-envfrom-demo
PRE_verbose_level=-vv
PRE_httpd_port=8080
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
GOLANG_VERSION=1.9.2
GOPATH=/go
HOME=/root
apiVersion: v1
kind: Pod
metadata:
name: configmap-volume-demo
namespace: default
spec:
containers:
- image: nginx:v1.0.0
name: nginx
volumeMounts:
- name: ngxconfig
mountPath: /etc/nginx/conf.d/
readOnly: true
volumes:
- name: ngxconfig
configMap:
name: nginx-config-files
Secret 類似ConfigMap, 主要用來存放敏感數據, 例如: 密碼, 憑證, 私鑰和 SSH Key等, 由於K8s上只要有權限的人都看得到Secret的內容, 所以並沒有真的很Secret。
Secret由四種類型組成:
generic
docker-registry
tls
Secret spec配置字段除了apiVersion
, kind
, metadata
, 其他可用字段有:
data
<map[string]string>: "key:value" 格式, 通常需要為base64編碼的字符串, 要自己編碼stringData
<map[string]string>: 明文定義"key:value" 格式 ,不需base64編碼, 這個字段不會被API輸出type
: 提供內部編程識別類別的typeSecret 除了kind 要替換為Secret 以及 使用secretName之外, spec內容與ConfigMap大致相同。
apiVersion: v1
kind: Secret
metadata:
name: nginx-ssl
stringData:
tls1: crt
tls2: key
type: Opaque
---
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-demo
spec:
containers:
- image: nginx:latest
name: nginx
volumeMounts:
- name: nginxcert
mountPath: /etc/nginx/ssl
readOnly: true
volumes:
- name: nginxcert
secret:
secretName: nginx-ssl
-> % kubectl exec secret-volume-demo ls /etc/nginx/ssl
tls1
tls2
K8s 可以透過imagePullSecret從需要認證的私倉取得image, 它透過Secret提供的密碼讓kubectl在拉image之前就能通過認證。
使用方式有兩種:
imagePullSecret
字段imagePullSecret
的資訊實務上使用ServiceAccount去拉images會比在每個Pod配置檔案中添加imagePullSecret來得方便。
讀到這裡我看了一下我們目前在使用的K8s部署專案, ConfigMap一個專案都會用1-2個, Secret 主要用來放置可以查看的私鑰, Secret真的沒有很Secret, 真的要放敏感資料的話還是要評估一下。